package com.hbnu.cmd.controller;

import com.hbnu.cmd.view.MainView;
import com.hbnu.cmd.view.RegisterView;
import com.hbnu.common.factory.ServiceFactory;
import com.hbnu.common.response.ServiceResponse;
import com.hbnu.common.entity.User;
import com.hbnu.common.service.LoginService;
import com.hbnu.common.util.CheckUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 登录功能控制台控制器，负责处理用户登录相关的控制台请求。
 * 该控制器接收用户输入的登录信息，
 * 进行初步参数校验后，调用{@link LoginService}处理核心业务逻辑，
 * 并将处理结果（成功/失败提示）输出到控制台。
 * 同时，通过SLF4J记录关键操作日志，便于问题追踪和系统监控。
 */

public class LoginController {
    private static final Logger logger = LoggerFactory.getLogger(LoginController.class);
    private final LoginService loginService = ServiceFactory.getLoginService();

    /**
     * 处理用户登录请求，完成参数校验、业务逻辑调用和结果展示。
     * 流程如下：
     * 1. 记录登录请求日志（包含用户名）；
     * 2. 通过{@link CheckUtil}工具类校验用户名和密码格式合法性；
     * 3. 若参数校验失败，输出错误提示并记录警告日志，直接返回；
     * 4. 若参数合法，调用{@link LoginService#handleLogin(String, String)}处理登录逻辑；
     * 5. 根据Service返回的{@link ServiceResponse}，输出对应提示；
     * 6. 记录登录结果日志（成功/失败原因）。
     * 7. 若成功登录，则跳转至主业务界面（{@link MainView}）；
     *
     * @param username 用户输入的登录账号（用户名）
     * @param password 用户输入的登录密码
     */
    public void handleLogin(String username, String password) {
        logger.info("收到登录请求：用户名={}", username);

        String errorMessage = CheckUtil.checkUsername(username);
        if (errorMessage != null) {
            logger.warn("登录失败：用户名={}，原因={}", username, errorMessage);
            System.err.println("登录失败：" + errorMessage + "!");
            return;
        }

        errorMessage = CheckUtil.checkPassword(password);
        if (errorMessage != null) {
            logger.warn("登录失败：用户名={}，原因={}", username, errorMessage);
            System.err.println("登录失败：" + errorMessage + "!");
            return;
        }

        ServiceResponse<User> response = loginService.handleLogin(username, password);
        if (response.isSuccess()) {
            logger.info("登录成功：用户名={}", username);
            System.out.println(response.getAlertMessage() + "!");

            new MainView(response.getData()).show();
        } else {
            logger.error("登录失败：用户名={}，原因={}", username, response.getErrorMessage());
            System.err.println("登录失败：" + response.getErrorMessage() + "!");
        }
    }

    /**
     * 处理用户注册请求，展示注册页面。
     * 流程如下：
     * 1. 记录注册请求日志；
     * 2. 调用{@link RegisterView#show()}跳转至注册页面。
     */
    public void handleRegister() {
        logger.info("收到注册请求");
        new RegisterView().show();
    }

    /**
     * 处理用户退出请求：记录日志。
     */
    public void handleExit() {
        logger.info("收到退出请求");
    }

    /**
     * 处理用户忘记密码请求，展示联系管理员的提示信息。
     * 流程如下：
     * 1. 记录忘记密码请求日志；
     * 2. 调用{@link LoginService#handleForgetPassword()}获取提示信息；
     * 3. 将提示信息输出到控制台；
     * 4. 根据Service返回的{@link ServiceResponse}，记录结果日志（成功/失败）。
     */
    public void handleForgetPassword() {
        logger.info("收到忘记密码请求");

        ServiceResponse<Void> response = loginService.handleForgetPassword();
        System.out.println(response.getAlertMessage() + "!");

        if (response.isSuccess()) {
            logger.info("忘记密码提示成功：{}", response.getAlertMessage());
        } else {
            logger.warn("忘记密码提示失败：{}", response.getErrorMessage());
        }
    }
}
